//
// Created by yonghu0 on 25-10-9.
//

#include <iostream>
#include <unordered_set> //unordered_set所在头文件
#include <functional> //greater的头文件
#include <utility> //pair的头文件

void print(std::unordered_set<int> &my_unordered_set)
{
    for (auto &elem: my_unordered_set)
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
}


int main()
{
    std::cout << "unordered_set_test begin" << std::endl;

    std::cout << "--------------创建unordered_set----------------" << std::endl;
    //方法一
    std::unordered_set<int> my_unordered_set1;
    //方法二
    int arr1[] = {3, 1, 4, 2};
    std::unordered_set<int> my_unordered_set2(arr1, arr1 + 4);
    for (auto &elem: my_unordered_set2)
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    std::cout << "----------------容器size--------------" << std::endl;
    std::cout << my_unordered_set1.size() << std::endl;
    std::cout << "----------------容器判空---------------" << std::endl;
    std::cout << my_unordered_set1.empty() << std::endl;

    std::cout << "----------插入元素--------------------" << std::endl;
    //插入单个元素
    std::pair<std::unordered_set<int>::iterator, bool> pres = my_unordered_set1.insert(5);
    print(my_unordered_set1);
    std::cout << pres.second << std::endl;
    pres = my_unordered_set1.insert(5); //插入重复元素
    print(my_unordered_set1);
    std::cout << pres.second << std::endl;
    //插入区间
    my_unordered_set1.insert(arr1, arr1 + 4);
    print(my_unordered_set1);

    std::cout << "------------查找元素(判断元素是否在容器中)-----------" << std::endl;
    //方法一
    if (my_unordered_set1.find(3) != my_unordered_set1.end())
    {
        std::cout << "元素在unordered_set中" << std::endl;
    } else
    {
        std::cout << "元素不在unordered_set中" << std::endl;
    }
    //方法二
    if (my_unordered_set1.count(3))
    {
        std::cout << "元素在unordered_set中" << std::endl;
    } else
    {
        std::cout << "元素不在unordered_set中" << std::endl;
    }

    std::cout << "------------修改unordered_set中的元素(错误操作)--------------" << std::endl;
    //unordered_set的迭代器是const_iterator，unordered_set中的元素不允许修改，
    //因为修改的话会引起底层哈希表的结构变化
    std::cout << "------------删除元素-----------------------------" << std::endl;
    //删除单个元素
    //方法一
    my_unordered_set1.erase(3);
    print(my_unordered_set1);
    my_unordered_set1.erase(11); //删除不存在的元素，不报错
    print(my_unordered_set1);
    //方法二
    my_unordered_set1.erase(my_unordered_set1.begin());
    print(my_unordered_set1);
    //删除区间
    //用的不多，这里就不列举

    std::cout << "----其他用法(equal_range)-----" << std::endl;
    //equal_range方法
    //equal_range(x)返回值为x的迭代器范围
    //unordered_set中的equal_range(x)函数用于返回一个包含指定键值范围的迭代器对（pair），
    //其first成员指向第一个匹配的元素(x)，second成员指向最后一个匹配元素(x)的下一个位置。
    std::pair<std::unordered_set<int>::iterator, std::unordered_set<int>::iterator> p_equal_range;
    p_equal_range = my_unordered_set1.equal_range(4);
    std::cout << *(p_equal_range.first) << " " << *(p_equal_range.second) << std::endl;

    std::cout << "------------清空容器-----------------" << std::endl;
    my_unordered_set1.clear();
    print(my_unordered_set1);

    std::cout << "unordered_set_test end" << std::endl;
    return 0;
}
